package com.zwj.common.utils;

import com.zwj.vo.entity.User;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author zwj
 * @Description: jwt工具类
 * @date 2022/5/10 10:05 上午
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
@Slf4j
public class JwtUtil {
    @Value("${jwt.config.key}")
    private String key;//秘钥
    @Value("${jwt.config.expireTime}")
    private Long expireTime;//过期时间

    /**
     * 生成token
     * @param user 用户信息
     * @return
     */
    public String createToken(User user) {
        long nowMills = System.currentTimeMillis();
        Date date = new Date(nowMills);

        //头部
        Map<String, Object> header = new HashMap<>();
        header.put("alg", SignatureAlgorithm.HS256.getValue());//不使用签名算法
        header.put("typ", "JWT");

        //载荷
        Map<String, Object> body = new HashMap<>();
        body.put("id", user.getId());
        body.put("userName", user.getUserName());

        //添加签名，生成token
        String token = Jwts.builder()
                .setHeader(header)
                .setClaims(body)
                .setExpiration(new Date(nowMills + expireTime)) //设置过期时间，12小时
                .signWith(SignatureAlgorithm.HS256, key)//指定签名算法，添加秘钥"qwer"，秘钥字符最少4个字符
                .compact();
        return token;
    }

    /**
     * 解析token，获取用户信息
     * @param token
     * @return
     */
    public Claims parseToken(String token) {
        Claims jwtBody = null;
        try {
            Claims body = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
            return body;
        } catch (ExpiredJwtException e) {
            log.error("token已失效");
        } catch (Exception e) {
            log.error("token不合法");
        }
        return null;
    }
}